package com.zyj.ai_agent.app;

import com.zyj.ai_agent.advisor.MyLoggerAdvisor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.ai.chat.memory.InMemoryChatMemory;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.stereotype.Component;

import java.util.List;

import static org.springframework.ai.chat.client.advisor.AbstractChatMemoryAdvisor.CHAT_MEMORY_CONVERSATION_ID_KEY;
import static org.springframework.ai.chat.client.advisor.AbstractChatMemoryAdvisor.CHAT_MEMORY_RETRIEVE_SIZE_KEY;

@Component
@Slf4j
public class LoveApp {
    // 定义一个ChatClient对象
    private final ChatClient chatClient;

    // 定义一个系统提示
    public static final String SYSTEM_PROMPT = "扮演深耕恋爱心理领域的专家。开场向用户表明身份，告知用户可倾诉恋爱难题。围绕单身、恋爱、已婚三种状态提问：单身状态询问社交圈拓展及追求心仪对象的困扰；恋爱状态询问沟通、习惯差异引发的矛盾；已婚状态询问家庭责任与亲属关系处理的问题。引导用户详述事情经过、对方反应及自身想法，以便给出专属解决方案。\n";

    // 构造函数，传入ChatModel对象
    public LoveApp(ChatModel dashscopeChatModel){
        // 创建一个ChatMemory对象
        ChatMemory chatMemory = new InMemoryChatMemory();
        // 使用ChatClient.builder()方法创建一个ChatClient对象，并设置默认的系统提示和默认的顾问
        chatClient = ChatClient.builder(dashscopeChatModel)
                // 设置默认的系统提示
                .defaultSystem(SYSTEM_PROMPT)
                // 设置默认的顾问
                .defaultAdvisors(
                        new MessageChatMemoryAdvisor(chatMemory),
                        new MyLoggerAdvisor()
                )
                // 构建ChatClient对象
                .build();
    }


    // 处理聊天请求
    public String doChat(String message, String chatId){
        // 调用chatClient的prompt方法，传入用户消息和聊天ID
        ChatResponse chatResponse = chatClient
                .prompt()
                .user(message)
                .advisors(spec -> spec.param(CHAT_MEMORY_CONVERSATION_ID_KEY, chatId)
                        .param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 10))
                // 调用call方法，获取聊天响应
                .call()
                .chatResponse();
        // 获取聊天响应中的输出文本
        String content = chatResponse.getResult().getOutput().getText();
        // 打印输出文本
        log.info("content:{}",content);
        // 返回输出文本
        return content;
    }

    record LoveReport(String title, List<String> suggestions){}

    public LoveReport doChatWithReport(String message, String chatId){
        LoveReport loveReport = chatClient
                .prompt()
                .system(SYSTEM_PROMPT + "每次对话后都要生成恋爱结果，标题为{用户名}的恋爱报告，内容为建议列表")
                .user(message)
                .advisors(spec -> spec.param(CHAT_MEMORY_CONVERSATION_ID_KEY, chatId)
                        .param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 10))
                // 调用call方法，获取聊天响应
                .call()
                .entity(LoveReport.class);

        log.info("loveReport:{}",loveReport);
        return loveReport;
    }
}
